/**	@file disegno.cc
 *Questo è un file C++ che contiene le definizioni delle funzioni dichiarate in disegno.h.
 * Tutte le funzioni interne a questo file sono atte al disegno degli oggetti del programma, o
 * all'aggiornamento della loro posizione per venire poi disegnate nella posizione corretta.
 */

#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
#include <iostream>
#include "disegno.h"
#include "models.h"
#include "globali.h"
#include "debug.h"

using namespace std;

void disegna_drago(Drago &drago)
{
	D1(cout<<"  disegna_drago"<<endl);
	
	D2(cout<<"drago.ID"<<drago.ID<<"  drago.x"<<drago.x<<"  drago.y"<<drago.y<<" drago.vite"<<drago.vite);
	D2(cout<<" drago.velocita:"<<drago.velocita<<" drago.boundx:"<<drago.boundx<<" drago.boundy:"<< drago.boundy);
	D2(cout<<" drago.punti: "<<drago.punti<<" drago.maxFrame:"<<drago.maxFrame<<" drago.frameAttuale:"<<drago.frameAttuale);
	D2(cout<<" drago.frameCount: "<<drago.frameCount<<" drago.frameRit"<<drago.frameRit<<endl);

	al_draw_bitmap(giocatore[drago.frameAttuale], drago.x, drago.y, 0);

	//al_draw_filled_rectangle(drago.x,  drago.y, drago.x + drago.boundx, drago.y + drago.boundy, al_map_rgba(255, 0, 255, 100));
}

void muovi_drago_sx(Drago &drago)
{

	D1(cout<<"  muovi_drago_sx"<<endl);
	
	D2(cout<<"drago.ID"<<drago.ID<<"  drago.x"<<drago.x<<"  drago.y"<<drago.y<<" drago.vite"<<drago.vite);
	D2(cout<<" drago.velocita:"<<drago.velocita<<" drago.boundx:"<<drago.boundx<<" drago.boundy:"<< drago.boundy);
	D2(cout<<" drago.punti: "<<drago.punti<<" drago.maxFrame:"<<drago.maxFrame<<" drago.frameAttuale:"<<drago.frameAttuale);
	D2(cout<<" drago.frameCount: "<<drago.frameCount<<" drago.frameRit"<<drago.frameRit<<endl);
	
	if(drago.x < 0)
		drago.x = 0;
	assert(drago.x >= 0);
	
	if(++drago.frameCount >= drago.frameRit)
	{
		drago.frameAttuale ++;
		if(drago.frameAttuale > drago.maxFrame)
			drago.frameAttuale = 5;
		drago.frameCount = 0;
	}
	drago.x -= drago.velocita;

}
void muovi_drago_dx(Drago &drago)
{
	D1(cout<<"  muovi_drago_dx"<<endl);
	
	D2(cout<<"drago.ID"<<drago.ID<<"  drago.x"<<drago.x<<"  drago.y"<<drago.y<<" drago.vite"<<drago.vite);
	D2(cout<<" drago.velocita:"<<drago.velocita<<" drago.boundx:"<<drago.boundx<<" drago.boundy:"<< drago.boundy);
	D2(cout<<" drago.punti: "<<drago.punti<<" drago.maxFrame:"<<drago.maxFrame<<" drago.frameAttuale:"<<drago.frameAttuale);
	D2(cout<<" drago.frameCount: "<<drago.frameCount<<" drago.frameRit"<<drago.frameRit<<endl);
	
	
	if(drago.x > WIDTH-50)
		drago.x = WIDTH-50;
		
	assert(drago.x <= WIDTH-50);
	
	if(++drago.frameCount >= drago.frameRit)
	{
		drago.frameAttuale ++;
		if(drago.frameAttuale > drago.maxFrame)
			drago.frameAttuale=0;
			
		drago.frameCount=0;
	}
	drago.x += drago.velocita;
}



void disegna_bolle(Bolle bolle[], int dim)
{
	D1(cout<<"  disegna_bolle"<<endl);	
	
 	for( int i = 0; i < dim; i++)
	{
		D2(cout<<"bolle["<<i<<"].ID"<<bolle[i].ID<<"  bolle["<<i<<"].x"<<bolle[i].x<<"  bolle["<<i<<"].y"<<bolle[i].y);
		D2(cout<<" bolle["<<i<<"].velocita:"<<bolle[i].velocita<<" bolle["<<i<<"].raggio:"<<bolle[i].raggio<<endl);
		
		if(bolle[i].vivo)
			al_draw_filled_circle(bolle[i].x, bolle[i].y, bolle[i].raggio, al_map_rgb(10, 255, 0));

	}
}
void spara_bolle(Bolle bolle[], int dim, Drago &drago)
{
	D1(cout<<"  spara_bolle"<<endl);
	
	D2(cout<<"drago.ID"<<drago.ID<<"  drago.x"<<drago.x<<"  drago.y"<<drago.y<<" drago.vite"<<drago.vite);
	D2(cout<<" drago.velocita:"<<drago.velocita<<" drago.boundx:"<<drago.boundx<<" drago.boundy:"<< drago.boundy);
	D2(cout<<" drago.punti: "<<drago.punti<<" drago.maxFrame:"<<drago.maxFrame<<" drago.frameAttuale:"<<drago.frameAttuale);
	D2(cout<<" drago.frameCount: "<<drago.frameCount<<" drago.frameRit"<<drago.frameRit<<endl);
	
	for( int i = 0; i < dim; i++)
	{
		D2(cout<<"bolle["<<i<<"].ID"<<bolle[i].ID<<"  bolle["<<i<<"].x"<<bolle[i].x<<"  bolle["<<i<<"].y"<<bolle[i].y);
		D2(cout<<" bolle["<<i<<"].velocita:"<<bolle[i].velocita<<" bolle["<<i<<"].raggio:"<<bolle[i].raggio<<endl);
		
		if(!bolle[i].vivo)
		{
			bolle[i].x = drago.x + 17;
			bolle[i].y = drago.y;
			bolle[i].vivo = true;
			al_play_sample(spara, 1, 0, 1, ALLEGRO_PLAYMODE_ONCE, 0);
			break;
		}
	}
}
void update_bolle(Bolle bolle[], int dim)
{
	D1(cout<<"  update_bolle"<<endl);
	
	for(int i = 0; i < dim; i++)
	{
		D2(cout<<"bolle["<<i<<"].ID"<<bolle[i].ID<<"  bolle["<<i<<"].x"<<bolle[i].x<<"  bolle["<<i<<"].y"<<bolle[i].y);
		D2(cout<<" bolle["<<i<<"].velocita:"<<bolle[i].velocita<<" bolle["<<i<<"].raggio:"<<bolle[i].raggio<<endl);
	
		if(bolle[i].vivo)
		{
			bolle[i].y -= bolle[i].velocita;
			if(bolle[i].y <= 0)
				bolle[i].vivo = false;
		}
	}
}



void disegna_robot(Robot robot[], int dim)
{
	D1(cout<<"  disegna_robot"<<endl);
	
	for(int i = 0; i < dim; i++)
	{
			D2(cout<<"robot["<<i<<"].ID"<<robot[i].ID<<"  robot["<<i<<"].x"<<robot[i].x<<"  robot["<<i<<"].y"<<robot[i].y);
			D2(cout<<" robot["<<i<<"].velocita:"<<robot[i].velocita<<" robot["<<i<<"].boundx:"<<robot[i].boundx<<" robot["<<i<<"].boundy:"<< drago.boundy);
			D2(cout<<" robot["<<i<<"].maxFrame:"<<robot[i].maxFrame<<" robot["<<i<<"].frameAttuale:"<<robot[i].frameAttuale);
			D2(cout<<" robot["<<i<<"].frameCount: "<<robot[i].frameCount<<" robot["<<i<<"].frameRit"<<robot[i].frameRit<<endl);
			
		if(robot[i].vivo)
		{
			al_draw_bitmap(nemici[robot[i].frameAttuale], robot[i].x, robot[i].y, 0);
			//al_draw_filled_rectangle(robot[i].x, robot[i].y, robot[i].x+robot[i].boundx, robot[i].y+robot[i].boundy, al_map_rgb(100,100,100));
		}
	}
}
void inizializza_partenza_robot(Robot robot[], int dim)
{
	D1(cout<<"  inizializza_partenza_robot"<<endl);
	
	for(int i = 0; i < dim; i++)
	{
		if(!robot[i].vivo)
		{
			if(rand() % 300 == 0)
			{
				robot[i].vivo = true;
				robot[i].x = 29 + rand() % (WIDTH - 60);
				robot[i].y = 0;

				break;
			}
		}
		
		D2(cout<<"robot["<<i<<"].ID"<<robot[i].ID<<"  robot["<<i<<"].x"<<robot[i].x<<"  robot["<<i<<"].y"<<robot[i].y);
		D2(cout<<" robot["<<i<<"].velocita:"<<robot[i].velocita<<" robot["<<i<<"].boundx:"<<robot[i].boundx<<" robot["<<i<<"].boundy:"<< robot[i].boundy);
		D2(cout<<" robot["<<i<<"].maxFrame:"<<robot[i].maxFrame<<" robot["<<i<<"].frameAttuale:"<<robot[i].frameAttuale);
		D2(cout<<" robot["<<i<<"].frameCount: "<<robot[i].frameCount<<" robot["<<i<<"].frameRit"<<robot[i].frameRit<<endl);	
	}
}
void update_robot(Robot robot[], int dim)
{
	D1(cout<<"  update_robot"<<endl);
	
	for(int i = 0; i < dim; i++)
	{
		if(robot[i].vivo)
		{		
			D2(cout<<"robot["<<i<<"].ID"<<robot[i].ID<<"  robot["<<i<<"].x"<<robot[i].x<<"  robot["<<i<<"].y"<<robot[i].y);
			D2(cout<<" robot["<<i<<"].velocita:"<<robot[i].velocita<<" robot["<<i<<"].boundx:"<<robot[i].boundx<<" robot["<<i<<"].boundy:"<< robot[i].boundy);
			D2(cout<<" robot["<<i<<"].maxFrame:"<<robot[i].maxFrame<<" robot["<<i<<"].frameAttuale:"<<robot[i].frameAttuale);
			D2(cout<<" robot["<<i<<"].frameCount: "<<robot[i].frameCount<<" robot["<<i<<"].frameRit"<<robot[i].frameRit<<endl);
			
			if(++robot[i].frameCount >= robot[i].frameRit)
			{
				robot[i].frameAttuale ++;
				if(robot[i].frameAttuale >= robot[i].maxFrame)
					robot[i].frameAttuale = 0;
				else if( robot[i].frameAttuale <= 0)
					robot[i].frameAttuale = robot[i].maxFrame - 1;

				robot[i].frameCount = 0;
			}
			if(drago.punti < 2000)
				robot[i].y += robot[i].velocita;
			else if(drago.punti >= 2000 && drago.punti < 4000)
				robot[i].y += robot[i].velocita+1;
			else if(drago.punti >= 4000 && drago.punti < 6000)
				robot[i].y += robot[i].velocita+2;
			else if(drago.punti >= 6000 && drago.punti < 8000)
				robot[i].y += robot[i].velocita+3;
			else if(drago.punti >= 8000)
				robot[i].y += robot[i].velocita+4;
			else if(drago.punti >= 10000)
			{
				robot[i].y += robot[i].velocita+6;
				drago.velocita = 12;
			}
		}
	}
}



void disegna_frutta(Frutta frutta[], int dim)
{
	D1(cout<<"  disegna_frutta"<<endl);
	
	for(int i = 0; i < dim; i++)
	{
		if(frutta[i].vivo)
		{
			D2(cout<<"frutta["<<i<<"].ID"<<frutta[i].ID<<"  frutta["<<i<<"].x"<<frutta[i].x<<"  frutta["<<i<<"].y"<<frutta[i].y);
			D2(cout<<" frutta["<<i<<"].velocita:"<<frutta[i].velocita<<" frutta["<<i<<"].boundx:"<<frutta[i].boundx<<" frutta["<<i<<"].boundy:"<< frutta[i].boundy<<endl);
			
			al_draw_bitmap(bonus[frutta[i].tipo], frutta[i].x, frutta[i].y, 0);
			//al_draw_filled_rectangle(robot[i].x, robot[i].y, robot[i].x+robot[i].boundx, robot[i].y+robot[i].boundy, al_map_rgb(100,100,100));
		}
	}
}
void inizializza_partenza_frutta(Frutta frutta[], int dim)
{
	D1(cout<<"  inizializza_partenza_frutta"<<endl);
	
	for(int i = 0; i < dim; i++)
	{
		if(!frutta[i].vivo)
		{
			D2(cout<<"frutta["<<i<<"].ID"<<frutta[i].ID<<"  frutta["<<i<<"].x"<<frutta[i].x<<"  frutta["<<i<<"].y"<<frutta[i].y<<" robot["<<i<<"].vite"<<drago.vite);
			D2(cout<<" frutta["<<i<<"].velocita:"<<frutta[i].velocita<<" frutta["<<i<<"].boundx:"<<frutta[i].boundx<<" frutta["<<i<<"].boundy:"<< frutta[i].boundy<<endl);
			
			if(rand() % 300 == 0)
			{
				frutta[i].vivo = true;
				frutta[i].x = 30 + rand() % (WIDTH - 60);
				frutta[i].y = 0;

				break;
			}
		}
	}
}
void update_frutta(Frutta frutta[], int dim)
{
	D1(cout<<"  update_frutta"<<endl);
	
	for(int i = 0; i < dim; i++)
	{
		if(frutta[i].vivo)
		{
			D2(cout<<"frutta["<<i<<"].ID"<<frutta[i].ID<<"  frutta["<<i<<"].x"<<frutta[i].x<<"  frutta["<<i<<"].y"<<frutta[i].y);
			D2(cout<<" frutta["<<i<<"].velocita:"<<frutta[i].velocita<<" frutta["<<i<<"].boundx:"<<frutta[i].boundx<<" frutta["<<i<<"].boundy:"<< frutta[i].boundy<<endl);
			
			frutta[i].y += frutta[i].velocita;
		}
	}
}


void update_sfondo(Sfondo &sfondo)
{
	D1(cout<<"  update_sfondo"<<endl);
	
	D2(cout<<"sfondo.x:"<<sfondo.x<<" sfondo.y:"<<sfondo.y<<" sfondo.velX"<< sfondo.velY<<" sfondo.dirX:"<<sfondo.dirX<<" sfondo.dirY:"<<" sfondo.width"<<" sfondo.height"<<sfondo.height<<endl);
	
	if(sfondo.velY)
	{
		sfondo.y += sfondo.velY * sfondo.dirY;
		if(sfondo.y + sfondo.height <= 0)
			sfondo.y = 0;
	}
	if(sfondo.velX)
	{
		sfondo.x += sfondo.velX * sfondo.dirX;
		if(sfondo.x + sfondo.width <= 0)
			sfondo.x = 0;		
	}
}
void disegna_sfondo(Sfondo &sfondo)
{
	D1(cout<<"  disegna_sfondo"<<endl);
	
	D2(cout<<"sfondo.x:"<<sfondo.x<<" sfondo.y:"<<sfondo.y<<" sfondo.velX"<< sfondo.velY<<" sfondo.dirX:"<<sfondo.dirX<<" sfondo.dirY:"<<" sfondo.width"<<" sfondo.height"<<sfondo.height<<endl);
		
	al_draw_bitmap(sfondo.immagine, sfondo.x, sfondo.y, 0);

	if(sfondo.y + sfondo.height < HEIGHT)
		al_draw_bitmap(sfondo.immagine, sfondo.x, sfondo.y + sfondo.height , 0);
	if(sfondo.x + sfondo.width < 800)
		al_draw_bitmap(sfondo.immagine, sfondo.x + sfondo.width, sfondo.y , 0);
}
